package PrzestrzenCiagla;

import FunkcjePrzynaleznosci.DrugorzedneFunkcjePrzynaleznosciFabryka;
import FunkcjePrzynaleznosci.IFunkcjaPrzynaleznosci;
import FunkcjePrzynaleznosci.FNFSCFunkcjaPrzynaleznosci;

public class ZbiorRozmytyTypu2 {

	private PrzestrzenCiagla przestrzenZeroJeden;
	private CiaglyZbiorRozmyty bazowyZbiorRozmyty;
	private String funkcjaDrugorzednaTyp;
	private float funkcjaDrugorzednaSzerokosc;
	private CiaglyZbiorRozmyty zbiorFNFSC = null;

	public ZbiorRozmytyTypu2(PrzestrzenCiagla przestrzen, IFunkcjaPrzynaleznosci bazowaFunkcjaPrzynaleznosci,
			String drugorzednaFunkcjaPrzynaleznosciTyp, float drugorzednaFunkcjaPrzynaleznosciSzerokosc) {
		this.przestrzenZeroJeden = new PrzestrzenCiagla(0f, 1f, 0.01f);
		this.bazowyZbiorRozmyty = new CiaglyZbiorRozmyty(przestrzen, bazowaFunkcjaPrzynaleznosci);
		this.funkcjaDrugorzednaTyp = drugorzednaFunkcjaPrzynaleznosciTyp;
		this.funkcjaDrugorzednaSzerokosc = drugorzednaFunkcjaPrzynaleznosciSzerokosc;
	}

	public ZbiorRozmytyTypu2(CiaglyZbiorRozmyty zbiorTypu1) {
		this(zbiorTypu1.getPrzestrzen(), zbiorTypu1.getFunkcjaPrzynaleznosci(), IFunkcjaPrzynaleznosci.JEDNOSTKOWA, 0);
	}

	public ZbiorRozmytyTypu2(PrzestrzenCiagla przestrzen, CiaglyZbiorRozmyty bazowyZbiorRozmyty,
			String drugorzednaFunkcjaPrzynaleznosciTyp, float drugorzednaFunkcjaPrzynaleznosciSzerokosc) {
		this(przestrzen, bazowyZbiorRozmyty.getFunkcjaPrzynaleznosci(), drugorzednaFunkcjaPrzynaleznosciTyp,
				drugorzednaFunkcjaPrzynaleznosciSzerokosc);
	}

	public PrzestrzenCiagla getPrzestrzen() {
		return bazowyZbiorRozmyty.getPrzestrzen();
	}

	public IFunkcjaPrzynaleznosci getBazowaFunkcjaPrzynaleznosci() {
		return bazowyZbiorRozmyty.getFunkcjaPrzynaleznosci();
	}

	public float getBazowaPrzynaleznosc(float x) {
		return bazowyZbiorRozmyty.getFunkcjaPrzynaleznosci().getWartosc(x);
	}

	public CiaglyZbiorRozmyty getPrzynaleznosc(float x) {
		float przynaleznosc = getBazowaPrzynaleznosc(x);
		IFunkcjaPrzynaleznosci drugorzednaFunkcjaPrzynaleznosci = DrugorzedneFunkcjePrzynaleznosciFabryka.getFunkcjaPrzynaleznosci(
				funkcjaDrugorzednaTyp, funkcjaDrugorzednaSzerokosc, przynaleznosc);
		return new CiaglyZbiorRozmyty(przestrzenZeroJeden, drugorzednaFunkcjaPrzynaleznosci);
	}

	public float getClm() {
		return getZbiorFNFSC().getClm();
	}

	public float getDlugoscNosnika() {
		return getZbiorFNFSC().dlugoscNosnika();
	}

	public CiaglyZbiorRozmyty getZbiorFNFSC() {
		if (zbiorFNFSC == null) {
			if (DrugorzedneFunkcjePrzynaleznosciFabryka.getFunkcjaPrzynaleznosci(funkcjaDrugorzednaTyp, funkcjaDrugorzednaSzerokosc, 0f)
					.czyOstra()) {
				zbiorFNFSC = bazowyZbiorRozmyty;
			} else {
				zbiorFNFSC = new CiaglyZbiorRozmyty(bazowyZbiorRozmyty.getPrzestrzen(), new FNFSCFunkcjaPrzynaleznosci(bazowyZbiorRozmyty
						.getFunkcjaPrzynaleznosci(), funkcjaDrugorzednaSzerokosc, bazowyZbiorRozmyty.getPrzestrzen()));
			}
		}
		return zbiorFNFSC;

	}
}
